//直接字面量进行类型声明，有点像常量
let a: 10;
a = 10;
// a = 11;

//可以使用 | 来连接多个类型(联合类型)
let b: "male" | "female";  //有点像枚举类型
b = "male";
b = "female";
// b = "hello";

let c: boolean | string;    //有点像泛型
c = true;
c = "hello";

//any表示任意类型，一个变量设置类型为any后，相当于对该变量关闭了TS的类型检测
//不建议使用any类型，和js没区别了
// let d: any;  //显式的any

//声明变量如果不指定类型，则TS解析器会自动判断变量的类型为any
let d;   //隐式的any
d = 10;
d = 'hello';
d = true;

//unknown 表示未知类型的值
let e: unknown;
e = 10;
e = true;
e = 'hello';

let s: string;
//d的类型为any,它可以赋值给任意变量，不会报错
// s = d;
//unknown实际上就是一个类型安全的any
//unknown类型的变量，不能直接赋值给其他变量
// s = e;   //报错
if (typeof e === 'string') {
    s = e
}

//类型断言,可以用来告诉解析器变量的实际类型
/**
 * 语法：
 *  变量 as 类型
 *  <类型>变量
 */
s = e as string;
s = <string>e;

//void 用来表示空，以函数为例，就表示没有返回值
function fn(): void {
    //下面写法都可以
    // return undefined;
    //   return null;
    //   return;
}

//never 表示永远不会返回结果
function fn2(): never {
    throw new Error('报错了！');
}



export {};